#include <iostream>
using namespace std;

template<class T>
class ArrayStack {
public:
    ArrayStack(int max_size);
    // 入栈
    void push(T data);
    // 出栈
    T pop();
    // 判断是否满
    bool is_full();
    // 判断是否空
    bool is_empty();
    // 遍历栈
    void traverse();
    // 返回栈顶元素
    T top_data();
private:
    int max_size;
    T *array;
    int top;
};

template<class T>
ArrayStack<T>::ArrayStack(int max_size) {
    this->max_size = max_size;
    array = new T[max_size];
    top = -1;
}

template<class T>
bool ArrayStack<T>::is_full() {
    return top == max_size-1;
}

template<class T>
bool ArrayStack<T>::is_empty() {
    return top == -1;
}

template<class T>
void ArrayStack<T>::push(T data) {
    if (is_full())
        throw "stack is full";
    top++;
    array[top] = data;
}

template<class T>
T ArrayStack<T>::pop() {
    if (is_empty)
        throw "Stack is empty";
}

template<class T>
void ArrayStack<T>::traverse() {
    if (is_empty())
        throw "Stack is empty";
    for(int i = top; i >= 0; i--)
        cout << array[i] << " ";
    cout << endl;
}

template<class T>
T ArrayStack<T>::top_data() {
    return array[top];
}